package com.gxa.zuul.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

@Component
public class MyZuulFilter extends ZuulFilter {
    // ZuulFilter的作用是为了验证哪些请求是合法才会放行，否则直接决定请求，并返回错误信息
    @Override
    public String filterType() {
        /*
            filterType方法返回一个字符串代表过滤器的类型，在zuul中定义了四种不同生命周期的过滤器类型，具体如下：
            pre：路由之前
            routing：路由之时
            post： 路由之后
            error：发送错误调用
         */
        return "pre";
    }

    @Override
    public int filterOrder() {
        /*
             filterOrder方法代表过滤的顺序
         */
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        /*
             shouldFilter方法可以写逻辑判断，是否要过滤，true代表永远过滤
         */
        return true;
    }

    @Override
    public Object run() {
        /*
            run方法代表自定义逻辑，可以调用sql或nosql来判断权限处理等，
            run方法默认返回null，如果在返回之前输出自定义响应数据，调用ctx.setSendZuulResponse(false);则结束路由，不会向服务消费发起请求
         */
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        System.out.println("url=" + request.getRequestURL().toString() + " method="  + request.getMethod());
        Object accessToken = request.getParameter("id");
        if(accessToken == null) {
            try {
                // 终止路由，直接返回客户端信息
                ctx.setSendZuulResponse(false);  // 设置为false，终止路由
                ctx.setResponseStatusCode(500);
                HttpServletResponse response = ctx.getResponse();
                response.setContentType("application/json;charset=utf-8");
                PrintWriter out = ctx.getResponse().getWriter();
                out.write("{'code':500,'msg':'没有传递id'}");
            }catch (Exception e){
                e.printStackTrace();
            }
            return null;
        }
        return null;
    }
}
